package ifmo.itip.applesgame;

import java.util.Random;


public class Dispatcher 
{
	int gamersCount,fieldCount;
	float P;
	int counter=0;
	public volatile int countApples,countApplesEat;
	Integer field[][];
	public void Start(int N,int M,float P) 
	{
		this.gamersCount = M;
		this.fieldCount = N;
		this.P = P;
		field = new Integer[N][N];
		for(int j = 0;j<N;j++)
		{
			for(int k=0;k<N;k++)
			{
				if(getApple())
				{
					field[j][k] = -1;
					countApples++;
					//System.out.println("Посадили яблоко"+j+k);
				}
			}
		}
		Gamer[] gamer = new Gamer[M];
		for(int i=0;i<gamersCount;i++)
		{
			gamer[i] = new Gamer(this,i);
			Random r = new Random();
			while(true)
			{
				int x = r.nextInt(N);
				int y = r.nextInt(N);
				if(field[x][y]==null)
				{
					field[x][y]=gamer[i].id;
					gamer[i].x=x;
					gamer[i].y=y;
					//System.out.println("Поставлен");
					break;
				}
			}
			gamer[i].start();
		}
		System.out.println("Всего игроков: "+gamersCount);
		System.out.println("Всего яблок: "+countApples);
		System.out.println("Игра началась!");
	}
	public void gameOver()
	{
		System.out.println("GAME OVER");
	}
	public void sendStatistics(Gamer g)
	{
		System.out.println("Игрок "+g.id+" съел "+g.myApple+" яблок");
	}
	public synchronized void hod(Gamer gamer,int hod) throws InterruptedException
	{
		if(countApples==countApplesEat)
		{
			sendStatistics(gamer);
			return;
		}
		if(counter == gamersCount) counter = 0;
		if(gamer.id == counter)
		{
			//Thread.currentThread().sleep(1000);
			System.out.println("Ходи, игрок "+gamer.id);
			switch(hod)
			{
				case 0:
				{
					System.out.println("Игрок "+gamer.id+" хочет вверх, он стоит на "+gamer.x+" "+gamer.y);
					if(gamer.y==0 || (field[gamer.x][gamer.y-1]!=null && field[gamer.x][gamer.y-1]!=-1)) System.out.println("Ход не удался");
					else
					{
						if(field[gamer.x][gamer.y-1]!=null && field[gamer.x][gamer.y-1]==-1)
						{
							gamer.eat();
						}
						field[gamer.x][gamer.y]=null;
						field[gamer.x][gamer.y-1]=gamer.id;
						gamer.y--;
						System.out.println("Игрок "+gamer.id+" походил вверх");
					}
					break;
				}
				case 1:
				{
					System.out.println("Игрок "+gamer.id+" хочет влево, он стоит на "+gamer.x+" "+gamer.y);
					if(gamer.x==0 || (field[gamer.x-1][gamer.y]!=null && field[gamer.x-1][gamer.y]!=-1)) System.out.println("Ход не удался");
					else
					{
						if(field[gamer.x-1][gamer.y]!=null && field[gamer.x-1][gamer.y]==-1)
						{
							gamer.eat();
						}
						field[gamer.x][gamer.y]=null;
						field[gamer.x-1][gamer.y]=gamer.id;
						gamer.x--;
						System.out.println("Игрок "+gamer.id+" походил влево");
					}
					break;
				}
				case 2:
				{
					System.out.println("Игрок "+gamer.id+" хочет вниз, он стоит на "+gamer.x+" "+gamer.y);
					if(gamer.y==fieldCount-1 || (field[gamer.x][gamer.y+1]!=null && field[gamer.x][gamer.y+1]!=-1)) System.out.println("Ход не удался");
					else
					{
						if(field[gamer.x][gamer.y+1]!=null && field[gamer.x][gamer.y+1]==-1)
						{
							gamer.eat();
						}
						field[gamer.x][gamer.y]=null;
						field[gamer.x][gamer.y+1]=gamer.id;
						gamer.y++;
						System.out.println("Игрок "+gamer.id+" походил вниз");
					}
					break;
				}
				case 3:
				{
					System.out.println("Игрок "+gamer.id+" хочет вправо, он стоит на "+gamer.x+" "+gamer.y);
					if(gamer.x==fieldCount-1 || (field[gamer.x+1][gamer.y]!=null && field[gamer.x+1][gamer.y]!=-1)) System.out.println("Ход не удался");
					else
					{
						if(field[gamer.x+1][gamer.y]!=null && field[gamer.x+1][gamer.y]==-1)
						{
							gamer.eat();
						}
						field[gamer.x][gamer.y]=null;
						field[gamer.x+1][gamer.y]=gamer.id;
						gamer.x++;
						System.out.println("Игрок "+gamer.id+" походил вправо");
					}
					break;
				}
			}
			if(countApples==countApplesEat)
			{
				gameOver();
				sendStatistics(gamer);
				return;
			}
			counter++;
		}
	}
	public boolean getApple()
	{
		Random r = new Random();
		return (r.nextFloat() < P);
	}
}
